#include <iostream>

// 前向声明
class Document;

// 抽象状态类
class DocumentState {
public:
    virtual void edit(Document* document) {}
    virtual void submit(Document* document) {}
    virtual void approve(Document* document) {}
    virtual void reject(Document* document) {}
    virtual void view(Document* document) {}
    virtual ~DocumentState() {}
};

// 具体状态：草稿
class DraftState : public DocumentState {
public:
    void edit(Document* document) override {
        std::cout << "文档处于草稿状态，可以编辑。" << std::endl;
    }
    void submit(Document* document) override;
};

// 具体状态：审核中
class ReviewState : public DocumentState {
public:
    void approve(Document* document) override;
    void reject(Document* document) override;
};

// 具体状态：已发布
class PublishedState : public DocumentState {
public:
    void view(Document* document) override {
        std::cout << "文档已发布，可以查看。" << std::endl;
    }
};

// 上下文：文档
class Document {
private:
    DocumentState* state;
public:
    Document();
    ~Document();
    void setState(DocumentState* newState);
    void edit();
    void submit();
    void approve();
    void reject();
    void view();
};

// DraftState 类的 submit 方法实现
void DraftState::submit(Document* document) {
    std::cout << "文档已提交审核。" << std::endl;
    document->setState(new ReviewState());
}

// ReviewState 类的 approve 方法实现
void ReviewState::approve(Document* document) {
    std::cout << "文档审核通过，已发布。" << std::endl;
    document->setState(new PublishedState());
}

// ReviewState 类的 reject 方法实现
void ReviewState::reject(Document* document) {
    std::cout << "文档审核未通过，打回草稿。" << std::endl;
    document->setState(new DraftState());
}

// Document 类的构造函数
Document::Document() {
    state = new DraftState();
}

// Document 类的析构函数
Document::~Document() {
    delete state;
}

// Document 类的 setState 方法
void Document::setState(DocumentState* newState) {
    delete state;
    state = newState;
}

// Document 类的 edit 方法
void Document::edit() {
    state->edit(this);
}

// Document 类的 submit 方法
void Document::submit() {
    state->submit(this);
}

// Document 类的 approve 方法
void Document::approve() {
    state->approve(this);
}

// Document 类的 reject 方法
void Document::reject() {
    state->reject(this);
}

// Document 类的 view 方法
void Document::view() {
    state->view(this);
}

int main() {
    Document document;
    document.edit();
    document.submit();
    document.approve();
    document.view();
    return 0;
}    